package beans;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.*;
import utils.ChequeaGmail;
import utils.Validador;

import bd.ConsultaInadecuadaException;
import bd.GestorBD;
import mapping.Usuario;
import mapping.Idioma;

public class BeanLoginUser {
	private String id = "";
	private String user = "";
	private String nomuser = "";
	private String gmail = "";

	public BeanLoginUser() {
		super();
	}

	public String getUser() {
		return user;
	}

	public void setUser(String user) {
		this.user = user;
	}

	public String getNomuser() {
		return nomuser;
	}

	public void setNomuser(String nomuser) {
		this.nomuser = nomuser;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getGmail() {
		return gmail;
	}

	public void setGmail(String gmail) {
		this.gmail = gmail;
	}

	/** CONSULTAS * */
	public List getUsuarios() {
		List listaUsers = new LinkedList();
		StringBuffer query = new StringBuffer("SELECT * FROM usuario;");
		try {
			ResultSet rs = GestorBD.consulta(query);
			if (rs != null) {
				while (rs.next()) {
					// la columna 2 contiene el email y en la 3 el nombre del
					// usuario
					listaUsers.add(rs.getString(1) + ":" + rs.getString(2)
							+ "," + rs.getString(3));
				}
			}
			rs.close();
		} catch (Exception e) {
			System.err.println("##### ERROR EN getAdmin");
		}
		return listaUsers;
	}

	public Usuario getUsuario(String id_usuario) {
		System.out.println(id_usuario);
		Usuario usuario = new Usuario();
		StringBuffer query = new StringBuffer(
				"SELECT * FROM usuario us, idioma id WHERE us.id_usuario = "
						+ id_usuario + " AND us.id_idioma = id.id_idioma;");
		try {
			ResultSet rsUsuario = GestorBD.consulta(query);
			if (rsUsuario != null && rsUsuario.next()) {
				String usersingmail = rsUsuario.getString("usuario");
				int pos = usersingmail.indexOf("@gmail.com");
				usersingmail = usersingmail.substring(0, pos);
				usuario = new Usuario(rsUsuario.getInt("id_usuario"),
						usersingmail, rsUsuario.getString("nombre"), rsUsuario
								.getString("apellidos"), rsUsuario
								.getString("email"), rsUsuario
								.getString("idioma"));
			}
			rsUsuario.close();
		} catch (Exception e) {
			System.err.println("##### ERROR EN getUsuario" + e.getMessage());
		}
		return usuario;
	}

	public List getIdiomas() {
		List listaIdiomas = new LinkedList();
		StringBuffer query = new StringBuffer("SELECT * FROM idioma;");
		try {
			ResultSet rs = GestorBD.consulta(query);
			while (rs.next()) {
				listaIdiomas.add(rs.getString(1) + "," + rs.getString(2));
			}
			rs.close();
		} catch (Exception e) {
			System.out.println("ERROR en getIdiomas");
		}
		return listaIdiomas;
	}

	/** INSERCIONES * */
	public boolean insertaUsuario(List parametros) throws Exception {
		StringBuffer query = new StringBuffer(
				"INSERT INTO usuario (usuario,nombre, apellidos,email,id_idioma)");
		query.append(" VALUES(?, ?, ?, ?, ?)");
		precondicionUsuario(parametros);
		try {
			GestorBD.inserta(query, parametros);
		} catch (ConsultaInadecuadaException e) {
			throw new Exception(e.toString());
		} catch (SQLException e) {
			throw new Exception(
					"Ha ocurrido un error durante el registro. Int&eacute;ntelo m&aacute;s tarde");
		} catch (Exception e) {
			throw new Exception(
					"Ha ocurrido un error durante el registro. Int&eacute;ntelo m&aacute;s tarde");
		}
		return true;
	}

	/*
	 * PROBLEMA en precondicion usuario se eleva excepcion al actualizar los
	 * datos de usuario pues prohibe de por si que un usuario ya este registrado -><-
	 * 
	 * SOLUCIONES POSIBLES: para flexibilizar y generalizar precondicion usuario
	 * o similares 1-Que tengan un argumento mas indicando el tipo de operacion
	 * o... 2-que cada bean tenga unos flags que permita saber que tipo de
	 * operacion se va a llevar a cabo
	 */
	/*
	 * Esto es un ejemplo: Posibles flags para mayor flexibilidad en
	 * precondicion usuario
	 */
	private final int ACTUALIZACION = 3;

	private int tipoOperacion;

	/** ACTUALIZACIONES * */

	public boolean actualizaUsuario(List parametros) throws Exception {
		StringBuffer query = new StringBuffer(
				"UPDATE usuario SET usuario=?, nombre=?, apellidos=?, email=?, id_idioma=? ");
		query.append("WHERE id_usuario = ?");
		tipoOperacion = ACTUALIZACION;
		precondicionUsuario(parametros);
		try {
			GestorBD.actualiza(query, parametros);
		} catch (ConsultaInadecuadaException e) {
			throw new Exception(e.toString());
		} catch (SQLException e) {
			throw new Exception(
					"Ha ocurrido un error durante la actualizaci&oacute;n de sus datos de usuario. Int&eacute;ntelo m&aacute;s tarde");
		} catch (Exception e) {
			throw new Exception(
					"Ha ocurrido un error durante la actualizaci&oacute;n de sus datos de usuario. Int&eacute;ntelo m&aacute;s tarde");
		}
		return true;
	}

	/** BORRADO * */

	public boolean validarUsuario(String userName, String password)
			throws NullPointerException, Exception {
		if (userName == null || userName.length() == 0) {
			throw new NullPointerException(
					"Por favor, introduzca su nombre de usuario");
		}
		if (password == null || password.length() == 0) {
			throw new NullPointerException(
					"Por favor, introduzca su contrase&ntilde;a");
		}
		if (!existeUsuario(userName)) {
			throw new Exception(
					"Su cuenta de usuario no se encuentra registrada. " +
					"Puede registrarse si lo desea desde <a href='registro.jsp'>aqu&iacute;</a>.");
		}
		if (!ChequeaGmail.validarPassw(userName, password)) {
			throw new Exception("Nombre de usuario o contrase&ntilde;a no v&aacute;lidos");
		}
		gmail = userName;
		return true;
	}

	public boolean existeUsuario(String user) {
		List usuarios = getUsuarios();
		Iterator it = usuarios.iterator();
		while (it.hasNext()) {
			String usit = (String) it.next();
			String iduser = usit.substring(0, usit.indexOf(":"));
			String useraux = usit.substring(usit.indexOf(":") + 1, usit
					.indexOf(","));
			String nomuser = usit.substring(usit.indexOf(",") + 1);
			// System.out.println(usit + " == " + user + "?" +
			// usit.equals(user));
			if (useraux.equals(user)) {
				this.nomuser = nomuser;
				this.id = iduser;
				return true;
			}
		}
		return false;
	}

	public void conectar() {
		try {
			GestorBD.conectar();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void desconectar() {
		try {
			GestorBD.desconectar();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	private void precondicionUsuario(List parametros) throws Exception {
		if (parametros == null || parametros.isEmpty()) {
			throw new NullPointerException(
					"ERROR: la lista de parametros es vacia");
		}
		if (existeUsuario((String) parametros.get(0))
				&& tipoOperacion != ACTUALIZACION) {
			throw new Exception("ERROR: el usuario ya esta registrado");
		}
		if (parametros.size() < 2) {
			throw new Exception("El numero de parametros es incorrecto");
		}
		// sabemos que en la posicion 0 de la lista esta el usuario
		// y en la 1 el nombre --> verificar que no son vacios
		String usuario = (String) parametros.get(0);
		String nombre = (String) parametros.get(1);
		// el email esta en la posicion 3 !!!
		String email = (String) parametros.get(3);
		if (usuario == null || usuario.length() == 0)
			throw new NullPointerException(
					"Por favor, introduzca su cuenta de gmail");
		if (nombre == null || nombre.length() == 0)
			throw new NullPointerException("Por favor, introduzca su nombre");
		// no funciona el validador
		if (email.length() > 0 && !Validador.esCorreoElectronico(email))
			throw new Exception("El correo electronico es incorrecto");
	}
}
